package com.hspedu.generic;

import java.util.ArrayList;

/**
 * @Author Stringzhua
 * @Date 2024/3/14 0:51
 * description:泛型的使用细节
 */
@SuppressWarnings("all")
public class GenericDetail {
    public static void main(String[] args) {
        //1.给泛型指向数据类型是,要求是引用类型,不能是基本数据类型
        ArrayList<Integer> list = new ArrayList<>();//ok
//        ArrayList<int> list1 = new ArrayList<int>();//错误
//        Type argument cannot be of primitive type 类型参数不能是基元类型
        //2.在给泛型指定具体类型后,可以传入该类型或其子类类型
        //因为E指定了A类型,构造器传入了newA()
        Pig<A> aPig = new Pig<A>(new A());
        aPig.f();
        Pig<A> aPig2 = new Pig<A>(new B());
        aPig2.f();
        //3.泛型使用形式
        ArrayList<Integer> list1 = new ArrayList<>();
        //在实际开发中,我们往往简写
        //编译器会进行类型推断【推荐使用下面写法】
        ArrayList<Integer> list2 = new ArrayList<>();

        ArrayList<Pig> pigs = new ArrayList<>();

        //4.如果是这样写.泛型默认是Object E
        ArrayList arrayList = new ArrayList();//等价 ArrayList<Object> arrayList = new ArrayList<>();
        /*
         public boolean add(E e) {
            ensureCapacityInternal(size + 1);  // Increments modCount!!
            elementData[size++] = e;
            return true;
        }
        * */

        Tiger tiger = new Tiger();
          /*
        class Tiger{//类
            Object e;

            public Tiger(Object e) {
                this.e = e;
            }
            public Tiger(){}
        }
        * */
    }
}

class Tiger<E>{//类
    E e;

    public Tiger(E e) {
        this.e = e;
    }
    public Tiger(){}
}


class A {

}

class B extends A {

}

class Pig<E> {//泛型
    E e;

    public Pig(E e) {
        this.e = e;
    }

    public void f() {
        System.out.println(e.getClass());//运行类型
    }
}